package br.com.fiap.beans;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.validator.ValidatorException;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.commons.beanutils.BeanUtils;

import br.com.fiap.beans.filtro.FiltroTrecho;
import br.com.fiap.beans.vo.CompraVO;
import br.com.fiap.dao.TrechoDAO;
import br.com.fiap.dao.VooDAO;
import br.com.fiap.entity.Trecho;
import br.com.fiap.entity.Voo;

@Named
@ManagedBean
@SessionScoped
public class CompraPassagensBean implements Serializable {

	private static final long serialVersionUID = -8508434366519352810L;
	
	private CompraVO compraVO = new CompraVO();
	private List<Trecho> trechos;
	private Map<Long, CompraVO> trechosComprados = new HashMap<Long, CompraVO>();
	private BigDecimal valorTotalCompra = BigDecimal.ZERO;
	
	@Inject
	private VooDAO vooDAO;
	
	@Inject
	private TrechoDAO trechoDAO;

	public CompraVO getCompraVO() {
		return compraVO;
	}

	public void setCompraVO(CompraVO compraVO) {
		this.compraVO = compraVO;
	}

	public Map<Long, CompraVO> getTrechosComprados() {
		return trechosComprados;
	}

	public void setTrechosComprados(Map<Long, CompraVO> trechosComprados) {
		this.trechosComprados = trechosComprados;
	}

	public BigDecimal getValorTotalCompra() {
		return valorTotalCompra;
	}

	public void setValorTotalCompra(BigDecimal valorTotalCompra) {
		this.valorTotalCompra = valorTotalCompra;
	}
	
	public List<Trecho> getTrechos() {
		return trechos;
	}

	public void setTrechos(List<Trecho> trechos) {
		this.trechos = trechos;
	}
	
	public List<CompraVO> getCompras() {
		
		List<CompraVO> compras = new LinkedList<CompraVO>();
		
		for (CompraVO c : trechosComprados.values()) {
			compras.add(c);
		}
		
		return compras;
	}

	public String adicionarItem() {
		
		this.trechos = this.trechoDAO.findByFilter(new FiltroTrecho());
		
		return "/compraPassagens/adicionar-item";
	}
	
	public String adicionarItemSubmit() throws IllegalAccessException, InvocationTargetException {

		CompraVO temp = new CompraVO();
		
		Trecho trecho = this.trechoDAO.findById(compraVO.getTrecho().getId());
		
		compraVO.setTrecho(trecho);

		BeanUtils.copyProperties(temp, compraVO);

		trechosComprados.put(temp.getTrecho().getId(), temp);
		
		valorTotalCompra = valorTotalCompra.add(temp.getValorCompra());

		this.compraVO = new CompraVO();
		
		return "/compraPassagens/carrinho-compras";

	}
	
	public void removerItem(CompraVO compraVO) {
		trechosComprados.remove(compraVO.getTrecho().getId());
		valorTotalCompra = valorTotalCompra.subtract(compraVO.getValorCompra());
	}
	
	public String finalizarCompra() {
		
		for (CompraVO c : trechosComprados.values()) {
			
			Voo voo = c.getTrecho().getVoo();

			voo.setAssentosEconomicosOcupados(c.getQuantidadePassagensEconomica());
			voo.setAssentosExecutivosOcupados(c.getQuantidadePassagensExecutiva());
			
			vooDAO.saveOrUpdate(voo);
			
		}
		
		return "/compraPassagens/sucesso-finalizacao-compra";
	}
	
	public void calculaValor() {
		
		Long idTrecho = compraVO.getTrecho().getId();
		
		if (idTrecho == null) {
			compraVO.setValorCompra(BigDecimal.ZERO);
			return;
		} 
		
		Trecho trecho = this.trechoDAO.findById(idTrecho);
		
		if (trecho == null) {
			compraVO.setValorCompra(BigDecimal.ZERO);
			return;
		}
		
		Integer qtdEconomica = compraVO.getQuantidadePassagensEconomica();
		Integer qtdExecutiva = compraVO.getQuantidadePassagensExecutiva();
		
		BigDecimal valorCompra = BigDecimal.ZERO;
		BigDecimal valorTrecho = trecho.getValor(); 
		
		if (valorCompra == null) {
			valorCompra = BigDecimal.ZERO;
		}
		
		if (qtdEconomica != null && qtdEconomica > 0) {
			valorCompra =  valorCompra.add(valorTrecho.multiply(new BigDecimal(qtdEconomica)));
		}
		
		if (qtdExecutiva != null && qtdExecutiva > 0) {
			valorCompra =  valorCompra.add(valorTrecho.multiply(new BigDecimal(qtdExecutiva)));
		}
		
		compraVO.setValorCompra(valorCompra);
		
	}

}
